package org.cocos2dx.javascript;

import android.Manifest;
import android.app.Activity;
import android.content.Intent;
import android.content.pm.PackageManager;
import android.net.Uri;
import android.os.Build;
import android.os.Bundle;
import android.provider.Settings;
import android.support.annotation.NonNull;
import android.support.annotation.Nullable;
import android.support.v4.app.ActivityCompat;
import android.util.Log;
import android.view.KeyEvent;
import android.view.View;
import android.view.ViewGroup;
import android.view.WindowManager;
import android.widget.RelativeLayout;
import android.widget.Toast;
import com.heytap.instant.upgrade.util.Constants;
import com.opos.mobad.api.InitParams;
import com.opos.mobad.api.MobAdManager;
import com.opos.mobad.api.ad.BannerAd;
import com.opos.mobad.api.ad.RewardVideoAd;
import com.opos.mobad.api.ad.SplashAd;
import com.opos.mobad.api.listener.IBannerAdListener;
import com.opos.mobad.api.listener.IRewardVideoAdListener;
import com.opos.mobad.api.listener.ISplashAdListener;
import com.opos.mobad.api.params.RewardVideoAdParams;
import com.opos.mobad.api.params.SplashAdParams;

import java.util.ArrayList;

public class SplashActivity extends Activity implements ISplashAdListener {
    private SplashAd mSplashAd;
    private static final int REQUEST_PERMISSIONS_CODE = 22;
    private ArrayList<String> mNeedRequestPMSList=new ArrayList<>();
    private String splashId=Config.SplashId;
    private boolean mCanJump = false;

    @Override
    protected void onCreate(@Nullable Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        Log.d(Config.TAG, "initOPPOAD");
        if (Build.VERSION.SDK_INT > Build.VERSION_CODES.LOLLIPOP_MR1) {
            /**
             * 如果你的 targetSDKVersion >= 23，就要主动申请好权限。如果您的 App 没有适配到
             Android6.0（即 targetSDKVersion < 23），那么只需要在这里直接调用 fetchSplashAd 方法。
             *
             */
            Log.d(Config.TAG, "initOPPOAD:checkAndRequestPermissions");
            checkAndRequestPermissions();
        } else {
            /**
             * 如果是 Android6.0 以下的机器，默认在安装时获得了所有权限，可以直接调用 SDK。
             */
            fetchSplashAd();
        }
    }

    private void checkAndRequestPermissions() {
        /**
         * READ_PHONE_STATE 权限是必须权限，没有这个权限 SDK无法正常获得广告。
         */
        if (PackageManager.PERMISSION_GRANTED !=
                ActivityCompat.checkSelfPermission(this, Manifest.permission.READ_PHONE_STATE)) {
            mNeedRequestPMSList.add(Manifest.permission.READ_PHONE_STATE);
        }


        /**
         * WRITE_EXTERNAL_STORAGE、 ACCESS_FINE_LOCATION 是两个可选权限；没有不影响 SDK
         获取广告；但是如果应用申请到该权限，会显著提升应用的广告收益。
         */
        if (PackageManager.PERMISSION_GRANTED !=
                ActivityCompat.checkSelfPermission(this,
                        Manifest.permission.WRITE_EXTERNAL_STORAGE)) {
            mNeedRequestPMSList.add(Manifest.permission.WRITE_EXTERNAL_STORAGE);
        }
        if (PackageManager.PERMISSION_GRANTED !=
                ActivityCompat.checkSelfPermission(this, Manifest.permission.ACCESS_FINE_LOCATION)) {
            mNeedRequestPMSList.add(Manifest.permission.ACCESS_FINE_LOCATION);
        }
        //
        if (0 == mNeedRequestPMSList.size()) {
            /**
             * 权限都已经有了，那么直接调用 SDK 请求广告。
             */
            Log.d(Config.TAG, "initOPPOAD:权限都已经有了，那么直接调用 SDK 请求广告");
            fetchSplashAd();
        } else {
            /**
             * 有权限需要申请，主动申请。
             */
            Log.d(Config.TAG, "initOPPOAD:有权限需要申请，主动申请");
            String[] temp = new String[mNeedRequestPMSList.size()];
            mNeedRequestPMSList.toArray(temp);
            ActivityCompat.requestPermissions(this, temp,
                    REQUEST_PERMISSIONS_CODE);
        }
    }

    @Override
    public void onRequestPermissionsResult(int requestCode,  @NonNull String[] permissions, @NonNull int[] grantResults) {
        super.onRequestPermissionsResult(requestCode, permissions, grantResults);
        switch (requestCode) {
            /**
             *处理 SDK 申请权限的结果。
             */
            case REQUEST_PERMISSIONS_CODE:
                if (hasNecessaryPMSGranted()) {
                    /**
                     * 应用已经获得 SDK 运行必须的 READ_PHONE_STATE权限，直接请求广告。
                     */
                    Log.d(Config.TAG, "initOPPOAD:应用已经获得 SDK 运行必须的 READ_PHONE_STATE权限，直接请求广告");
                    fetchSplashAd();
                } else {
                    /**
                     * 如果用户没有授权，那么应该说明意图，引导用户去设置里面授权。
                     */
                    Log.d(Config.TAG, "initOPPOAD:如果用户没有授权，那么应该说明意图，引导用户去设置里面授权。");
                    Toast.makeText(this, "应用缺少 SDK 运行必须的 READ_PHONE_STATE 权限！请点击\"应用权限\"，打开所需要的权限。", Toast.LENGTH_LONG).show();
                    Intent intent = new Intent(Settings.ACTION_APPLICATION_DETAILS_SETTINGS);
                    intent.setData(Uri.parse("package:" + getPackageName()));
                    startActivity(intent);
                    finish();
                }
                break;
            default:
                break;
        }
    }

    /**
     * 判断应用是否已经获得 SDK运行必须的 READ_PHONE_STATE、WRITE_EXTERNAL_STORAGE 两
     个权限。
     *
     * @return
     */
    private boolean hasNecessaryPMSGranted() {
        if (PackageManager.PERMISSION_GRANTED == ActivityCompat.checkSelfPermission(AppActivity.getContext(), Manifest.permission.READ_PHONE_STATE)) {
            return true;
        }
        return false;
    }

    private void fetchSplashAd(){
        try {
/**
 * SplashAd 初始化参数、这里可以设置获取广告最大超时时间，
 * 广告下面半屏的应用标题+应用描述
 * 注意：应用标题和应用描述是必传字段，不传将抛出异常
 */
            SplashAdParams splashAdParams = new SplashAdParams.Builder()
                    .setFetchTimeout(3000)
                    .setTitle(Config.APP_NAME)
                    .setDesc("")
                    .build();
/**
 * 构造 SplashAd 对象
 * 注意：构造函数传入的几个形参都不能为空，否则将抛出 NullPointerException 异常。
 */
            mSplashAd = new SplashAd(this, splashId, this,splashAdParams);
            Log.d(Config.TAG, "initOPPOAD:SplashAd 初始化参数、这里可以设置获取广告最大超时时间，");
        } catch (Exception e) {
            Log.d(Config.TAG, "initOPPOAD:splash异常"+e);
            Intent intent = new Intent(this, AppActivity.class);
            startActivity(intent);
            finish();
        }
    }

    @Override
    protected void onPause() {
        super.onPause();
/**
 * 这里包含对于点击闪屏广告以后、然后返回闪屏广告页面立刻跳转应用主页面的处理。
 */
        mCanJump = false;
    }
    @Override
    protected void onResume() {
        super.onResume();
/**
 * 这里包含对于点击闪屏广告以后、然后返回闪屏广告页面立刻跳转应用主页面的处理。
 */
        if (mCanJump) {
            next();
        }
        mCanJump = true;
    }
    @Override
    protected void onDestroy() {
        if (null != mSplashAd) {
            mSplashAd.destroyAd();
        }
        super.onDestroy();
    }

    @Override
    public boolean onKeyDown(int keyCode, KeyEvent event) {
        if (keyCode == KeyEvent.KEYCODE_BACK || keyCode == KeyEvent.KEYCODE_HOME) {
            return true;
        }
        return super.onKeyDown(keyCode, event);
    }

    /**
     * 结束闪屏页面，跳转主页面。
     */
    private void next() {
        if (mCanJump) {
            Intent intent = new Intent(this, AppActivity.class);
            startActivity(intent);
            finish();
        } else {
            mCanJump = true;
        }
    }
    @Override
    public void onAdDismissed() {
        Log.d(Config.TAG, "initOPPOAD:跳过闪屏");
        next();
    }

    @Override
    public void onAdShow() {
        Log.d(Config.TAG, "initOPPOAD:展示闪屏");
    }

    @Override
    public void onAdFailed(String s) {
/**
 * 如果加载广告失败，直接 finish(),跳转应用主页面。
 */
        Log.d(Config.TAG, "initOPPOAD:闪屏失败"+s);
        Intent intent = new Intent(this, AppActivity.class);
        startActivity(intent);
        finish();
    }

    @Override
    public void onAdFailed(int i, String s) {
        Log.d(Config.TAG, "initOPPOAD:闪屏加载失败"+s);
    }

    @Override
    public void onAdClick() {

    }
}
